package com.dang.dao;

import java.io.Serializable;
import java.util.List;

import com.dang.entity.PageBean;


/**
 * BaseDAO 封装
 * 
 * @author 但劲松
 * 
 */
public interface BaseDAO<T> {

	/**
	 * 序列化
	 * 
	 * @param o
	 * @return
	 */
	public Serializable save(T o);

	/**
	 * 删除
	 * 
	 * @param o
	 */
	public void delete(T o);

	/**
	 * 无策略 更新
	 * 
	 * @param o
	 */
	public void update(T o);

	/**
	 * 保存 或更新
	 * 
	 * @param o
	 */
	public void saveOrUpdate(T o);
	
	/**
	 * 先保存策略 更新
	 * @param o
	 */
	public void merge(T o);

	/**
	 * 查询集合 hql 
	 * 
	 * @param hql
	 * @return
	 */
	public List<T> find(String hql);

	/**
	 * 查询集合 hql 参数数组
	 * 
	 * @param hql
	 * @param param
	 * @return
	 */
	public List<T> find(String hql, Object[] param);

	/**
	 * 查询集合 hql 参数集合
	 * 
	 * @param hql
	 * @param param
	 * @return
	 */
	public List<T> find(String hql, List<Object> param);

	/**
	 * 查询集合 hql 参数数组 分页
	 * 
	 * @param hql
	 * @param param
	 * @param pageBean	
	 * @return
	 */
	public List<T> find(String hql, Object[] param, PageBean pageBean);

	/**
	 * 查询集合 hql 参数集合 分页
	 * 
	 * @param hql
	 * @param param
	 * @param page
	 * @param rows
	 * @return
	 */
	public List<T> find(String hql, List<Object> param, PageBean pageBean);

	/**
	 * id 取得实例
	 * 
	 * @param c  类名
	 * @param id
	 * @return Object
	 */
	public T get(Class<T> c, Serializable id);

	/**
	 * hql 查询对象 参数数组 
	 * 
	 * @param hql
	 * @param param
	 * @return Object
	 */
	public T get(String hql, Object[] param);

	/**
	 * hql 查询对象 参数集合
	 * 
	 * @param hql
	 * @param param
	 * @return
	 */
	public T get(String hql, List<Object> parm);

	/**
	 * select count(*) from 对象
	 * 数量 注意hql 写法
	 * @param hql
	 * @return
	 */
	public Long count(String hql);

	/**
	 * select count(*) from 对象
	 * 数量 注意hql 写法 参数数组
	 * @param hql
	 * @param param
	 * @return
	 */
	public Long count(String hql, Object[] param);

	/**
	 * select count(*) from 对象
	 * 数量 注意hql 写法 参数集合
	 * @param hql
	 * @param param
	 * @return
	 */
	public Long count(String hql, List<Object> param);

	/**
	 * 查询并转换 
	 * 数量 注意hql 写法 
	 * @param hql
	 * @return ��Ӧ��Ŀ
	 */
	public Integer executeHql(String hql);

	/**
	 * 查询并转换 
	 * 数量 注意hql 写法 参数数组
	 * @param hql
	 * @param param
	 * @return ��Ӧ��Ŀ
	 */
	public Integer executeHql(String hql, Object[] param);

	/**
	 * 查询并转换 
	 * 数量 注意hql 写法 参数集合
	 * @param hql
	 * @param param
	 * @return
	 */
	public Integer executeHql(String hql, List<Object> param);

	/**
	 * 查询sql 
	 * @param sql
	 * @return
	 */
	public Integer executeSql(String sql);
}
